#ifndef MAINWND_H_
#define MAINWND_H_

#include <QtWidgets/QWidget>
#include "ui_MainWnd.h"

#include <QTimer>
#include <QCameraViewfinder>
#include <QCameraInfo>
#include <QMediaMetaData>
#include <QCamera>
#include <QCameraImageCapture>
#include <QMutex>
#include <QStack>

#include <regex>
#include "CommonType.h"
#include "IPayplatInterface.h"
#include "IPlatformProxyInterface.h"
#include "IValidatorInterface.h"

class QTimer;
class QAbstractButton;
class QLabel;
class CCustomCameraView;

class MainWnd : public QWidget
{
	Q_OBJECT
public:
	MainWnd(QWidget *parent = Q_NULLPTR);
    ~MainWnd();

    inline void StartDeposit() { set_current_work_mode(EWorkMode_Deposit); }
    inline void StartFetch() { set_current_work_mode(EWorkMode_Fetch); }
    inline void SetViewTimeout(const zl::TimeoutItl& itl) { itl_ = itl; }

    void EventRequestOrderDetails(const std::string& order_id, const std::string& cabinet_no, int32_t boxno);
    void EventPayplatReply(const zl::PayReply& reply, int code);
    void EventITLEventCredit(int value, QString currency);

signals:
    void backToHome();

protected slots:
    void back_to_home();
    void back_to_last_view();
    void start_to_deposit();
    void start_to_fetch();

    void event_numpad_key_clicked(const QString& key);
    void event_numpad_ok_clicked();
    void event_numpad_del_clicked();
    void event_input_edt_text_changed();

protected:
    enum EWF {
        EWF_DepositSelectSize,      ///< 存物选箱型
        EWF_DepositSetNo,           ///< 存物录入手机号码信息
        EWF_DepositSetPwd,          ///< 存物录入密码信息
        EWF_FetchAuthPwd,           ///< 取物验证密码
        EWF_FetchOpen,              ///< 取物开箱
        EWF_OpenTips,               ///< 存物开箱提示
        EWF_PayType,                ///< 支付方式选择
        EWF_PayInfo,                ///< 支付页面

		EWF_Unknow
    };
    enum EWorkMode { EWorkMode_Normal, EWorkMode_Deposit, EWorkMode_Fetch };

    void init_view();
    void init_timer();
    void reset_timer(bool flag, int32_t itl);
    void set_current_work_mode(int32_t mode);
    void set_current_status(int32_t ewf, bool back_flag = false);
    void reset_current_session();
    bool check_userid(QString no1, QString no2);
    bool check_password(QString pw1, QString pw2);

    // 用户设置手机尾号结束
    void set_no_finished();
    // 用户设置密码结束
    void set_pwd_finished();
    // 存物预处理
    void deposit_preprocessor();
    // 用户存物流程结束
    void deposit_finished();
    // 获取用户输入的手机尾号，密码
    void get_auth_finished();
    // 用户取物验证通过
    void fetch_preprocessor();
    // 用户中途取物
    void fetch_temporary();
    // 用户结束使用
    void fetch_end_use();
    // 用户补交费用
    void fetch_back_fee();
    // 开箱提示
    void open_locker_tips(int32_t no, bool flag);
    // 用户支付成功
    void payment_complete(bool flag = true);
    // 用户选择了支付方式后，向支付服务器发起支付请求
    void event_paytype_selected(const std::string& type);
    // 由定时器触发，发起请求查询当前订单支付状态
    void event_payplat_polling();
    // 用户选择箱型
    void event_lockertype_selected(int32_t type);

    bool eventFilter(QObject *watched, QEvent *event);

private:
    Ui::MainWnd ui;

    EWF ewf_current_;
    EWorkMode mode_current_;
    QStack<EWF> ewf_stack_;

    zl::TimeoutItl				itl_;
    QTimer*                     timer_;
    int32_t						timer_cnt_;
    bool						timer_flag_;

    QTimer*                         timer_payplat_;
    zl::IPlatformProxyInterface*    plat_api_;
    zl::IValidatorInterface*        validator_;
    struct SessionImpl;
    SessionImpl* session_;
};

#endif // MAINWND_H_
